/** 【文件说明】：数值处理工具类
 *  【使用例子】：
 
    import { NumberUtils } from '@/utils/numberUtils';

    // 在某个方法或生命周期钩子中使用
    console.log(NumberUtils.formatNumber(1234567.89, 2)); // 输出 "1,234,567.89"
    console.log(NumberUtils.formatCurrency(1234567.89, 'USD')); // 输出 "$1,234,567.89"
    console.log(NumberUtils.round(1234567.89, 2)); // 输出 1234567.89
    console.log(NumberUtils.ceil(1234567.89, 2)); // 输出 1234567.9
    console.log(NumberUtils.floor(1234567.89, 2)); // 输出 1234567.89
    console.log(NumberUtils.getRandomInt(1, 100)); // 输出 1到100之间的随机整数
    console.log(NumberUtils.isInteger(123)); // 输出 true
    console.log(NumberUtils.isPositive(123)); // 输出 true
    console.log(NumberUtils.isNegative(-123)); // 输出 true
    console.log(NumberUtils.percentage(50, 200)); // 输出 25
    console.log(NumberUtils.formatPercentage(50, 200, 2)); // 输出 "25.00%"
    console.log(NumberUtils.inRange(50, 0, 100)); // 输出 true
        
 */
export class NumberUtils {
    /**
     * 数字格式化（千分位）
     * @param num 要格式化的数字
     * @param decimalPlaces 小数位数（默认为0）
     * @returns 返回格式化后的字符串
     */
    static formatNumber(num: number, decimalPlaces: number = 0): string {
      return num.toLocaleString('en-US', { minimumFractionDigits: decimalPlaces, maximumFractionDigits: decimalPlaces });
    }
  
    /**
     * 货币格式化
     * @param num 要格式化的数字
     * @param currency 货币代码（默认为USD）
     * @param locale 地区（默认为'en-US'）
     * @returns 返回货币格式化的字符串
     */
    static formatCurrency(num: number, currency: string = 'USD', locale: string = 'en-US'): string {
      return new Intl.NumberFormat(locale, { style: 'currency', currency: currency }).format(num);
    }
  
    /**
     * 四舍五入
     * @param num 要四舍五入的数字
     * @param decimalPlaces 小数位数（默认为0）
     * @returns 返回四舍五入后的数字
     */
    static round(num: number, decimalPlaces: number = 0): number {
      const factor = Math.pow(10, decimalPlaces);
      return Math.round(num * factor) / factor;
    }
  
    /**
     * 向上取整
     * @param num 要向上取整的数字
     * @param decimalPlaces 小数位数（默认为0）
     * @returns 返回向上取整后的数字
     */
    static ceil(num: number, decimalPlaces: number = 0): number {
      const factor = Math.pow(10, decimalPlaces);
      return Math.ceil(num * factor) / factor;
    }
  
    /**
     * 向下取整
     * @param num 要向下取整的数字
     * @param decimalPlaces 小数位数（默认为0）
     * @returns 返回向下取整后的数字
     */
    static floor(num: number, decimalPlaces: number = 0): number {
      const factor = Math.pow(10, decimalPlaces);
      return Math.floor(num * factor) / factor;
    }
  
    /**
     * 获取随机整数
     * @param min 最小值
     * @param max 最大值
     * @returns 返回一个在[min, max]范围内的随机整数
     */
    static getRandomInt(min: number, max: number): number {
      min = Math.ceil(min);
      max = Math.floor(max);
      return Math.floor(Math.random() * (max - min + 1)) + min;
    }
  
    /**
     * 判断是否为整数
     * @param num 要检查的数字
     * @returns 如果是整数则返回 true，否则返回 false
     */
    static isInteger(num: number): boolean {
      return Number.isInteger(num);
    }
  
    /**
     * 判断是否为正数
     * @param num 要检查的数字
     * @returns 如果是正数则返回 true，否则返回 false
     */
    static isPositive(num: number): boolean {
      return num > 0;
    }
  
    /**
     * 判断是否为负数
     * @param num 要检查的数字
     * @returns 如果是负数则返回 true，否则返回 false
     */
    static isNegative(num: number): boolean {
      return num < 0;
    }
  
    /**
     * 计算百分比
     * @param value 值
     * @param total 总数
     * @returns 返回计算后的百分比
     */
    static percentage(value: number, total: number): number {
      if (total === 0) {
        return 0;
      }
      return (value / total) * 100;
    }
  
    /**
     * 格式化百分比
     * @param value 值
     * @param total 总数
     * @param decimalPlaces 小数位数（默认为2）
     * @returns 返回格式化后的百分比字符串
     */
    static formatPercentage(value: number, total: number, decimalPlaces: number = 2): string {
      const percent = this.percentage(value, total);
      return `${this.formatNumber(percent, decimalPlaces)}%`;
    }
  
    /**
     * 检查数字是否在指定范围内
     * @param num 要检查的数字
     * @param min 最小值
     * @param max 最大值
     * @returns 如果数字在范围内则返回 true，否则返回 false
     */
    static inRange(num: number, min: number, max: number): boolean {
      return num >= min && num <= max;
    }
  }